package ooday05;

public class StaticFinalDemo {
    public static void main(String[] args) {
        /*
        - 必须声明同时初始化
        - 常常通过类名点来访问，不能被改变
        - 建议：常量名所有字母都大写，多个单词之间用_分隔
         */
        System.out.println(Loo.PI);
        //Loo.PI = 3.1415926; //编译错误，常量不能被改变

        //1)加载Loo.class到方法区
        //2)静态变量num一并存储到方法区中
        //3)到方法区中获取num的值并输出
        System.out.println(Loo.num);

        //编译器在编译时会将常量直接替换为具体的数，效率高
        //相当于System.out.println(5);
        System.out.println(Loo.COUNT);


        /*
        final修饰的变量只能被赋值一次，赋值后值不再改变（final要求地址值不能改变）。
            如果final修饰的是基本数据类型，表示该基本数据类型的值一旦在初始化后便不能发生变化；如果final修饰的是引用数据类型，
            则在对其初始化之后便不能再让其指向其他对象了，但该引用所指向的对象的内容是可以发生变化的。
　      另外，在用final修饰属性的时候，必须要显示初始化。初始化方式有两种，一种是在变量声明的时候初始化；
            一种方法是在声明变量的时候不赋初值，但是要在这个变量所在类的所有的构造函数中对这个变量赋初值。
         */
    }
}

class Loo{

    public static int num = 5; //静态变量
    public static final int COUNT =5; //常量（静态常量）

    public static final double PI = 3.14159;
    //public static final int NUM; //编译错误，常量必须声明同时初始化
}
